﻿//给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
//每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。
//换句话说，如果你在 nums[i] 处，你可以跳转到任意 nums[i + j] 处:
//0 <= j <= nums[i]
//i + j < n
//返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
//
//输入: nums = [2, 3, 1, 1, 4]
//输出 : 2
//解释 : 跳到最后一个位置的最小跳跃数是 2。
//从下标为 0 跳到下标为 1 的位置，跳 1 步，然后跳 3 步到达数组的最后一个位置。
//
//输入 : nums = [2, 3, 0, 1, 4]
//输出 : 2
//
//提示 :
//    1 <= nums.length <= 10^4
//    0 <= nums[i] <= 1000
//    题目保证可以到达 nums[n - 1]

class Solution {
public:
    int jump(vector<int>& nums) {
        int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();
        while (left <= right) // 保险的写法，以防跳不到n - 1的位置
        {
            if (maxPos >= n - 1) // 先判断⼀下是否已经能跳到最后⼀个位置
            {
                return ret;
            }
            // 遍历当成层，更新下⼀层的最右端
            for (int i = left; i <= right; i++) {
                maxPos = max(maxPos, nums[i] + i);
            }
            left = right + 1;
            right = maxPos;
            ret++;
        }
        return -1; // 跳不到的情况
    }
};